%     AERO LOAD - программа для нагружения агрегатов самолета распределенной нагрузкой
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Check_Distributions(Load)

global ErrCode;

if (~isempty(Load.Span_Load.Load_Diagram_Data))
    
    Distribution_Data = Load.Span_Load.Load_Diagram_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения погонной нагрузки по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения погонной нагрузки по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения погонной нагрузки по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения погонной нагрузки по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Trapezoid_Xd_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Trapezoid_Xd_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра Xd по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра Xd по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра Xd по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра Xd по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_p2_p1_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_p2_p1_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра p2/p1 по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p2/p1 по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p2/p1 по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p2/p1 по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_p3_p1_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_p3_p1_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра p3/p1 по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p3/p1 по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p3/p1 по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p3/p1 по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_p4_p1_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_p4_p1_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра p4/p1 по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p4/p1 по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p4/p1 по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра p4/p1 по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_f_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_f_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра f по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_f1_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_f1_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра f1 по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f1 по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f1 по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f1 по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.Model_X_f2_Distr_Data))
    
    Distribution_Data = Load.Chord_Pressure.Model_X_f2_Distr_Data;
    
    if (size(Distribution_Data,1) < 2)
        fprintf (1, '\nОшибка: в эпюре распределения параметра f2 по размаху должно быть не менее двух точек!\n');
        ErrCode = -1;
        return;
    end
    
    for i=1:size(Distribution_Data,1)

        if ((Distribution_Data(i,1) < 0) || (Distribution_Data(i,1) > 1))
            fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f2 по размаху лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Distribution_Data(i,1) < Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f2 по размаху должны быть заданы в порядке возрастания !\n');
                ErrCode = -1;
                return;
            end
            if (Distribution_Data(i,1) == Distribution_Data(i-1,1))
                fprintf (1, '\nОшибка: значения координаты по размаху в эпюре распределения параметра f2 по размаху не должны повторяться !\n');
                ErrCode = -1;
                return;
            end
        end

    end
    
end

if (~isempty(Load.Chord_Pressure.User_Model_Data))
    
%     if (size(Load.Chord_Pressure.User_Model_Data.Span_Coord,1) < 2)
%         fprintf (1, '\nОшибка: в законе распределения давления по хордам должно содержаться не менее двух эпюр!\n');
%         ErrCode = -1;
%         return;
%     end
    
    for i=1:size(Load.Chord_Pressure.User_Model_Data.Span_Coord,1)

        if ((Load.Chord_Pressure.User_Model_Data.Span_Coord(i,1) < 0) || (Load.Chord_Pressure.User_Model_Data.Span_Coord(i,1) > 1))
            fprintf (1, '\nОшибка: значения координат по размаху для эпюр распределения давления по хордам лежат вне интервала [0,1] !\n');
            ErrCode = -1;
            return;
        end

        if (i>1)
            if (Load.Chord_Pressure.User_Model_Data.Span_Coord(i,1) < Load.Chord_Pressure.User_Model_Data.Span_Coord(i-1,1))
                fprintf (1, '\nОшибка: значения координат по размаху для эпюр распределения давления по хордам должны быть заданы в порядке возрастания!\n');
                ErrCode = -1;
                return;
            end
            if (Load.Chord_Pressure.User_Model_Data.Span_Coord(i,1) == Load.Chord_Pressure.User_Model_Data.Span_Coord(i-1,1))
                fprintf (1, '\nОшибка: значения координат по размаху для эпюр распределения давления по хордам не должны повторяться!\n');
                ErrCode = -1;
                return;
            end
        end

    end

    for i=1:size(Load.Chord_Pressure.User_Model_Data.Pressure_Data,1)
        
        if (size(Load.Chord_Pressure.User_Model_Data.Pressure_Data{i},1) < 2)
            fprintf (1, '\nОшибка: в каждой эпюре распределения давления по хордам должно быть не менее двух точек!\n');
            ErrCode = -1;
            return;
        end
        
        for j=1:size(Load.Chord_Pressure.User_Model_Data.Pressure_Data{i},1)

            if ((Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j,1) < 0) || (Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j,1) > 1))
                fprintf (1, '\nОшибка: значения координаты по хорде в одной из эпюр распределения давления по хордам лежат вне интервала [0,1] !\n');
                ErrCode = -1;
                return;
            end

            if (j>1)
                if (Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j,1) < Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j-1,1))
                    fprintf (1, '\nОшибка: значения координаты по хорде в каждой эпюре распределения давления по хордам должны быть заданы в порядке возрастания!\n');
                    ErrCode = -1;
                    return;
                end
                if (Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j,1) == Load.Chord_Pressure.User_Model_Data.Pressure_Data{i}(j-1,1))
                    fprintf (1, '\nОшибка: в одной из эпюр распределения давления по хордам значения координаты по хорде повторяются!\n');
                    ErrCode = -1;
                    return;
                end
            end

        end
        
    end
    
end
